home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource4 / 267_01 / as6.doc < prev    next >
Text File  |  1989-01-13  |  44KB  |  1,158 lines

  1. /*
  2.     HEADER:        CUG267;
  3.     TITLE:        S6 Cross-Assembler (Portable);
  4.     FILENAME:    AS6.DOC;
  5.     VERSION:    0.2;
  6.     DATE:        08/27/1988;
  7.     SEE-ALSO:    AS6.H;
  8.     AUTHORS:    William C. Colley III;
  9. */
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.                             S6 Cross-Assembler (Portable)
  25.  
  26.  
  27.                                      Version 0.2
  28.  
  29.  
  30.                    Copyright (c) 1986, 1987 William C. Colley, III
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.                               The manual such as it is.
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.           Legal Note:    This package may be used for any commercial or
  50.                          non-commercial purpose.  It may be copied and
  51.                          distributed freely provided that any fee charged
  52.                          by the distributor of the copy does not exceed the
  53.                          sum of:  1) the cost of the media the copy is
  54.                          written on,  2) any required costs of shipping the
  55.                          copy, and  3) a nominal handling fee.  Any other
  56.                          distribution requires the written permission of
  57.                          the author.  Also, the author's copyright notices
  58.                          shall not be removed from the program source, the
  59.                          program object, or the program documentation.
  60.  
  61.  
  62.  
  63.                                   Table of Contents
  64.  
  65.           1.0  How to Use the Cross-Assembler Package ..................  3
  66.           2.0  Format of Cross-Assembler Source Lines ..................  4
  67.                2.1  Labels .............................................  5
  68.                2.2  Numeric Constants ..................................  5
  69.                2.3  String Constants ...................................  5
  70.                2.4  Expressions ........................................  6
  71.           3.0  Machine Opcodes .........................................  7
  72.                3.1  Opcodes -- No Arguments ............................  7
  73.                3.2  Opcodes -- Accumulator Operations ..................  7
  74.                3.3  Opcodes -- Read-Modify-Write Operations ............  8
  75.                3.4  Opcodes -- Binary Operations .......................  8
  76.                3.5  Opcodes -- Bit Manipulation Operations .............  8
  77.                3.6  Opcodes -- Load and Store Operations ...............  8
  78.                3.7  Opcodes -- Conditional Branches ....................  9
  79.                3.8  Opcodes -- Bit Conditional Branches ................  9
  80.                3.9  Opcodes -- Long Branches ...........................  9
  81.           4.0  Pseudo Opcodes ..........................................  9
  82.                4.1  Pseudo-ops -- DB ...................................  9
  83.                4.2  Pseudo-ops -- DS ................................... 10
  84.                4.3  Pseudo-ops -- DW ................................... 10
  85.                4.4  Pseudo-ops -- END .................................. 10
  86.                4.5  Pseudo-ops -- EQU .................................. 10
  87.                4.6  Pseudo-ops -- IF, ELSE, ENDIF ...................... 11
  88.                4.7  Pseudo-ops -- INCL ................................. 12
  89.                4.8  Pseudo-ops -- ORG .................................. 12
  90.                4.9  Pseudo-ops -- PAGE ................................. 12
  91.                4.10 Pseudo-ops -- TITLE ................................ 12
  92.                4.11 Pseudo-ops -- VAR .................................. 13
  93.           5.0  Assembly Errors ......................................... 13
  94.                5.1  Error * -- Missing Statement ....................... 13
  95.                5.2  Error ( -- Parenthesis Imbalance ................... 14
  96.                5.3  Error " -- Missing Quotation Mark .................. 14
  97.                5.4  Error B -- Branch Target Too Far Away .............. 14
  98.                5.5  Error D -- Illegal Digit ........................... 14
  99.                5.6  Error E -- Illegal Expression ...................... 14
  100.                5.7  Error I -- IF-ENDIF Imbalance ...................... 14
  101.                5.8  Error L -- Illegal Label ........................... 15
  102.                5.9  Error M -- Multiply Defined Label .................. 15
  103.                5.10 Error O -- Illegal Opcode .......................... 15
  104.                5.11 Error P -- Phasing Error ........................... 15
  105.                5.12 Error S -- Illegal Syntax .......................... 15
  106.                5.13 Error T -- Too Many Arguments ...................... 15
  107.                5.14 Error U -- Undefined Label ......................... 16
  108.                5.15 Error V -- Illegal Value ........................... 16
  109.           6.0  Warning Messages ........................................ 16
  110.                6.1  Warning -- Illegal Option Ignored .................. 16
  111.                6.2  Warning -- -l Option Ignored -- No File Name ....... 16
  112.                6.3  Warning -- -o Option Ignored -- No File Name ....... 16
  113.                6.4  Warning -- Extra Source File Ignored ............... 17
  114.                6.5  Warning -- Extra Listing File Ignored .............. 17
  115.                6.6  Warning -- Extra Object File Ignored ............... 17
  116.  
  117.  
  118.  
  119.  
  120.                                      1
  121.  
  122.  
  123.  
  124.           7.0  Fatal Error Messages .................................... 17
  125.                7.1  Fatal Error -- No Source File Specified ............ 17
  126.                7.2  Fatal Error -- Source File Did Not Open ............ 17
  127.                7.3  Fatal Error -- Listing File Did Not Open ........... 17
  128.                7.4  Fatal Error -- Object File Did Not Open ............ 17
  129.                7.5  Fatal Error -- Error Reading Source File ........... 17
  130.                7.6  Fatal Error -- Disk or Directory Full .............. 18
  131.                7.7  Fatal Error -- File Stack Overflow ................. 18
  132.                7.8  Fatal Error -- If Stack Overflow ................... 18
  133.                7.9  Fatal Error -- Too Many Symbols .................... 18
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.                                      2
  182.  
  183.  
  184.  
  185.           1.0  How to Use the Cross-Assembler Package
  186.  
  187.                First, the question, "What does a cross-assembler do?" needs
  188.           to be addressed as there is considerable confusion on this point.
  189.           A cross-assembler is just like any other assembler except that it
  190.           runs on some CPU other than the one for which it assembles code.
  191.           For example, this package assembles S6 source code into S6 object
  192.           code, but it runs on an 8080, a Z-80, an 8088, or whatever other
  193.           CPU you happen to have a C compiler for.  The reason that cross-
  194.           assemblers are useful is that you probably already have a CPU
  195.           with memory, disk drives, a text editor, an operating system, and
  196.           all sorts of hard-to-build or expensive facilities on hand.  A
  197.           cross-assembler allows you to use these facilites to develop code
  198.           for an S6.
  199.  
  200.           This program requires one input file (your S6 source code) and
  201.           zero to two output files (the listing and the object).  The input
  202.           file MUST be specified, or the assembler will bomb on a fatal
  203.           error.  The listing and object files are optional.  If no listing
  204.           file is specified, no listing is generated, and if no object file
  205.           is specified, no object is generated.  If the object file is
  206.           specified, the object is written to this file in "Intel
  207.           hexadecimal" format.
  208.  
  209.                The command line for the cross-assembler looks like this:
  210.  
  211.                     AS6 source_file { >list_file } { -o object_file }
  212.  
  213.           where the { } indicates that the specified item is optional.
  214.  
  215.                Some examples are in order:
  216.  
  217.                as6 tests6.asm                          source:   tests6.asm
  218.                                                        listing:  none
  219.                                                        object:   none
  220.  
  221.                as6 tests6.asm -l tests6.prn            source:   tests6.asm
  222.                                                        listing:  tests6.prn
  223.                                                        object:   none
  224.  
  225.                as6 tests6.asm -o tests6.hex            source:   tests6.asm
  226.                                                        listing:  none
  227.                                                        object:   tests6.hex
  228.  
  229.                as6 tests6.asm -l tests6.prn -o tests6.hex
  230.                                                        source:   tests6.asm
  231.                                                        listing:  tests6.prn
  232.                                                        object:   tests6.hex
  233.  
  234.                The order in which the source, listing, and object files are
  235.           specified does not matter.  Note that no default file name exten-
  236.           sions are supplied by the assembler as this gives rise to porta-
  237.           bility problems.
  238.  
  239.  
  240.  
  241.  
  242.                                      3
  243.  
  244.  
  245.  
  246.           2.0  Format of Cross-Assembler Source Lines
  247.  
  248.                The source file that the cross-assembler processes into a
  249.           listing and an object is an ASCII text file that you can prepare
  250.           with whatever editor you have at hand.  The most-significant
  251.           (parity) bit of each character is cleared as the character is
  252.           read from disk by the cross-assembler, so editors that set this
  253.           bit (such as WordStar's document mode) should not bother this
  254.           program.  All printing characters, the ASCII TAB character (09H),
  255.           and newline character(s) are processed by the assembler.  All
  256.           other characters are passed through to the listing file, but are
  257.           otherwise ignored.
  258.  
  259.                The source file is divided into lines by newline char-
  260.           acter(s).  The internal buffers of the cross-assembler will
  261.           accommodate lines of up to 255 characters which should be more
  262.           than ample for almost any job.  If you must use longer lines,
  263.           change the constant MAXLINE in file AS6.H and recompile the
  264.           cross-assembler.  Otherwise, you will overflow the buffers, and
  265.           the program will mysteriously crash.
  266.  
  267.                Each source line is made up of three fields:  the label
  268.           field, the opcode field, and the argument field.  The label field
  269.           is optional, but if it is present, it must begin in column 1.
  270.           The opcode field is optional, but if it is present, it must not
  271.           begin in column 1.  If both a label and an opcode are present,
  272.           one or more spaces and/or TAB characters must separate the two.
  273.           If the opcode requires arguments, they are placed in the argument
  274.           field which is separated from the opcode field by one or more
  275.           spaces and/or TAB characters.  Finally, an optional comment can
  276.           be added to the end of the line.  This comment must begin with a
  277.           semicolon which signals the assembler to pass the rest of the
  278.           line to the listing and otherwise ignore it.  Thus, the source
  279.           line looks like this:
  280.  
  281.                {label}{ opcode{ arguments}}{;commentary}
  282.  
  283.           where the { } indicates that the specified item is optional.
  284.  
  285.                Some examples are in order:
  286.  
  287.             column 1
  288.                |
  289.                v
  290.                GRONK   LD    A, (X)          ; This line has everything.
  291.                        INC   FOO             ; This line has no label.
  292.                BEEP                          ; This line has no opcode.
  293.                ; This line has no label and no opcode.
  294.  
  295.                ; The previous line has nothing at all.
  296.                        END                   ; This line has no argument.
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.                                      4
  304.  
  305.  
  306.  
  307.           2.1  Labels
  308.  
  309.                A label is any sequence of alphabetic or numeric characters
  310.           starting with an alphabetic.  The legal alphabetics are:
  311.  
  312.                   ! # $ % & . : ? @ [ \ ] ^ _  ` { | }  ~  A-Z  a-z
  313.  
  314.           The numeric characters are the digits 0-9.  Note that "A" is not
  315.           the same as "a" in a label.  This can explain mysterious U
  316.           (undefined label) errors occurring when a label appears to be
  317.           defined.
  318.  
  319.                A label is permitted on any line except a line where the
  320.           opcode is IF, ELSE, or ENDIF.  The label is assigned the value of
  321.           the assembly program counter before any of the rest of the line
  322.           is processed except when the opcode is EQU, ORG, or VAR.
  323.  
  324.                Labels can have the same name as opcodes, but they cannot
  325.           have the same name as operators or built-in constants.  The
  326.           reserved (operator and constant) names are:
  327.  
  328.                $         A         AND       EQ        GE        GT
  329.                HIGH      LE        LT        LOW       MOD       NE
  330.                NOT       OR        SHL       SHR       V         W
  331.                X         XOR       Y
  332.  
  333.                If a label is used in an expression before it is assigned a
  334.           value, the label is said to be "forward-referenced."  For
  335.           example:
  336.  
  337.                L1   EQU  L2 + 1   ; L2 is forward-referenced here.
  338.                L2
  339.                L3   EQU  L2 + 1   ; L2 is not forward-referenced here.
  340.  
  341.  
  342.           2.2  Numeric Constants
  343.  
  344.                Numeric constants are formed according to the Intel
  345.           convention.  A numeric constant starts with a numeric character
  346.           (0-9), continues with zero or more digits (0-9, A-F), and ends
  347.           with an optional base designator.  The base designators are H for
  348.           hexadecimal, none or D for decimal, O or Q for octal, and B for
  349.           binary.  The hex digits a-f are converted to upper case by the
  350.           assembler.  Note that a numeric constant cannot begin with A-F as
  351.           it would be indistinguishable from a label.  Thus, all of the
  352.           following evaluate to 255 (decimal):
  353.  
  354.                      0ffH   255   255D   377O   377Q   11111111B
  355.  
  356.  
  357.           2.3  String Constants
  358.  
  359.                A string constant is zero or more characters enclosed in
  360.           either single quotes (' ') or double quotes (" ").  Single quotes
  361.           only match single quotes, and double quotes only match double
  362.  
  363.  
  364.                                      5
  365.  
  366.  
  367.  
  368.           quotes, so if you want to put a single quote in a string, you can
  369.           do it like this:  "'".  In all contexts except the DB statement,
  370.           the first character or two of the string constant are all that
  371.           are used.  The rest is ignored.  Noting that the ASCII codes for
  372.           "A" and "B" are $41 and $42, respectively, will explain the
  373.           following examples:
  374.  
  375.                     "" and ''           evaluate to 0000H
  376.                     "A" and 'A'         evaluate to 0041H
  377.                     "AB"                evaluates to 4142H
  378.  
  379.           Note that the null string "" is legal and evaluates to 0000H.
  380.  
  381.  
  382.           2.4  Expressions
  383.  
  384.                An expression is made up of labels, numeric constants, and
  385.           string constants glued together with arithmetic operators,
  386.           logical operators, and parentheses in the usual way that
  387.           algebraic expressions are made.  Operators have the following
  388.           fairly natural order of precedence:
  389.  
  390.                Highest        anything in parentheses
  391.                               unary +, unary -
  392.                               *, /, MOD, SHL, SHR
  393.                               binary +, binary -
  394.                               LT, LE, EQ, GE, GT, NE
  395.                               NOT
  396.                               AND
  397.                               OR, XOR
  398.                Lowest         HIGH, LOW
  399.  
  400.                A few notes about the various operators are in order:
  401.  
  402.                1)   The remainder operator MOD yields the remainder from
  403.                     dividing its left operand by its right operand.
  404.  
  405.                2)   The shifting operators SHL and SHR shift their left
  406.                     operand to the left or right the number of bits
  407.                     specified by their right operand.
  408.  
  409.                3)   The relational operators LT, LE, EQ, GE, GT, and NE can
  410.                     also be written as <, <= or =<, =, >= or =>, and <> or
  411.                     ><, respectively.  They evaluate to 0FFFFH if the
  412.                     statement is true, 0 otherwise.
  413.  
  414.                4)   The logical opeators NOT, AND, OR, and XOR do bitwise
  415.                     operations on their operand(s).
  416.  
  417.                5)   HIGH and LOW extract the high or low byte, of an
  418.                     expression.
  419.  
  420.                6)   The special symbol $ can be used in place of a label or
  421.                     constant to represent the value of the program counter
  422.                     before any of the current line has been processed.
  423.  
  424.  
  425.                                      6
  426.  
  427.  
  428.  
  429.  
  430.                Some examples are in order at this point:
  431.  
  432.                2 + 3 * 4                          evaluates to 14
  433.                (2 + 3) * 4                        evaluates to 20
  434.                NOT 11110000B XOR 00001010B        evaluates to 00000101B
  435.                HIGH 1234H SHL 1                   evaluates to 0024H
  436.                001Q EQ 0                          evaluates to 0
  437.                001Q = 2 SHR 1                     evaluates to 0FFFFH
  438.  
  439.                All arithmetic is unsigned with overflow from the 16-bit
  440.           word ignored.  Thus:
  441.  
  442.                32768 * 2                          evaluates to 0
  443.  
  444.  
  445.           3.0  Machine Opcodes
  446.  
  447.                The opcodes of the S6 processor are divided into groups
  448.           below by the type of arguments required in the argument field of
  449.           the source line.  If an opcode requires multiple arguments, these
  450.           must be placed in the argument field in order (unless otherwise
  451.           specified) and separated by commas.  Some shorthand notations
  452.           will be used.  They are:
  453.  
  454.                notation       allowable range of expression
  455.  
  456.                A              0FFH
  457.                (XY)           80H to 81H (enclosed entirely in parentheses)
  458.                XYVW           80H to 83H
  459.                bit_number     0 to 7
  460.                immediate      -128 to 255
  461.                data_addr      0 to 0FFH
  462.                code_addr      0 to 0FFFH
  463.  
  464.           Note that the symbols A (0FFH), V (82H), W (83H), X (80H), and Y
  465.           (81H) are predefined by the assembler for your convenience.
  466.  
  467.  
  468.           3.1  Opcodes -- No Arguments
  469.  
  470.                The following opcodes allow no arguments at all in their
  471.           argument fields:
  472.  
  473.                     NOP       RET       RETI      STOP      WAIT
  474.  
  475.           Note that "NOP" is a built-in macro that assembles to the
  476.           instruction "JRZ  $+1".
  477.  
  478.  
  479.           3.2  Opcodes -- Accumulator Operations
  480.  
  481.                The following opcodes allow only an A in their argument
  482.           fields:
  483.  
  484.  
  485.  
  486.                                      7
  487.  
  488.  
  489.  
  490.                               COM       RLC       SLA
  491.  
  492.           Note that "SLA A" is a built-in macro that assembles to the
  493.           instruction "ADD  A,A".
  494.  
  495.  
  496.           3.3  Opcodes -- Read-Modify-Write Operations
  497.  
  498.                The opcodes INC and DEC require one argument in their
  499.           argument fields from the following list:
  500.  
  501.                     A         XYVW      (XY)      data_address
  502.  
  503.  
  504.           3.4  Opcodes -- Binary Operations
  505.  
  506.                The binary operations of the machine come in two forms.
  507.           Both require two arguments in their argument fields.  The
  508.           possible combinations go like this:
  509.  
  510.                Form      Opcodes                  Arguments
  511.  
  512.                 1        ADD, AND, CP, SUB        A, (XY)
  513.                                                   A, data_address
  514.  
  515.                 2        ADDI, ANDI, CPI, SUBI    A, immediate
  516.  
  517.  
  518.           3.5  Opcodes -- Bit Manipulation Operations
  519.  
  520.                The opcodes RES and SET require two arguments in their
  521.           argument fields.  The first is a bit_number, and the second is a
  522.           data_address.
  523.  
  524.  
  525.           3.6  Opcodes -- Load and Store Operations
  526.  
  527.                The LD opcode of the S6 is heavily overloaded.  It requires
  528.           two arguments in its argument field.  The possible combinations
  529.           are listed below:
  530.  
  531.                     A, XYVW        A, (XY)        A, data_address
  532.                     XYVW, A        (XY), A        data_address, A
  533.  
  534.                The LDI opcode is simpler.  It also requires two arguments.
  535.           The possible combinations are:
  536.  
  537.                A, immediate             data_address, immediate
  538.  
  539.                In addition, there are two built-in macros that load zero
  540.           into various places in memory.  "CLR  A" assembles to the
  541.           instruction "SUB  A,A" and "CLR  data_address" assembles to the
  542.           instruction "LDI  data_address,0".
  543.  
  544.  
  545.  
  546.  
  547.                                      8
  548.  
  549.  
  550.  
  551.           3.7  Opcodes -- Conditional Branches
  552.  
  553.                The opcodes JRC, JRNC, JRNZ, and JRZ require one argument in
  554.           their argument fields.  The argument is a code_address such that
  555.           the expression "code_address - $" is in the range -16 to +15.  If
  556.           the allowable range is exceeded, a B (Branch Target Too Far Away)
  557.           error is generated by the assembler.
  558.  
  559.  
  560.           3.8  Opcodes -- Bit Conditional Branches
  561.  
  562.                The opcodes JRR and JRS require three arguments in their
  563.           argument fields.  The first argument is a bit_number.  The second
  564.           argument is a data_address.  The third argument is a code_address
  565.           such that the expression "code_address - $" is in the range -126
  566.           to +129.  If the allowable range is exceeded, a B (Branch Target
  567.           Too Far Away) error is generated by the assembler.
  568.  
  569.                In addition, there are two built-in macros that generate bit
  570.           conditional branch instructions.  "JRP  code_address" assembles
  571.           to the instruction "JRR  7, A, code_address", i.e. jump relative
  572.           on accumulator positive.  "JRN  code_address" assembles to the
  573.           instruction "JRS  7, A, code_address", i.e. jump relative on
  574.           accumulator negative.
  575.  
  576.  
  577.           3.9  Opcodes -- Long Branches
  578.  
  579.                The opcodes CALL and JP require one argument in their
  580.           argument fields.  The argument is a code_address.
  581.  
  582.  
  583.           4.0  Pseudo Opcodes
  584.  
  585.                Unlike S6 opcodes, pseudo opcodes (pseudo-ops) do not
  586.           represent machine instructions.  They are, rather, directives to
  587.           the assembler.  These directives require various numbers and
  588.           types of arguments.  They will be listed individually below.
  589.  
  590.  
  591.           4.1  Pseudo-ops -- DB
  592.  
  593.                The DB pseudo-op allows arbitrary bytes to be spliced into
  594.           the object code.  Its argument is a chain of zero or more
  595.           expressions that evaluate to -128 through 255 separated by
  596.           commas.  If a comma occurs with no preceding expression, a 00H
  597.           byte is spliced into the object code.  The sequence of bytes
  598.           0FEH, 0FFH, 00H, 01H, 02H could be spliced into the code with the
  599.           following statement:
  600.  
  601.                          DB        -2, -1, , 1, 2
  602.  
  603.           A special case exists here.  If a string constant is entered with
  604.           no arithmetic done on it, then the entire string is spliced into
  605.           the code stream.  Thus, the sequence of bytes 002H, 043H, 041H,
  606.  
  607.  
  608.                                      9
  609.  
  610.  
  611.  
  612.           054H, 044H could be spliced into the code with the following
  613.           statement:
  614.  
  615.                          DB        1 + 1, "CAT", "C" + 1
  616.  
  617.  
  618.           4.2  Pseudo-ops -- DS
  619.  
  620.                The DS pseudo-op is used to reserve a block of storage for
  621.           program variables, or whatever.  This storage is not initialized
  622.           in any way, so its value at run time will usually be random.  The
  623.           argument expression (which may contain no forward references) is
  624.           added to the assembly program counter.  The following statement
  625.           would reserve 10 bytes of storage called "STORAGE":
  626.  
  627.                STORAGE   DS        10
  628.  
  629.  
  630.           4.3  Pseudo-ops -- DW
  631.  
  632.                The DW pseudo-op allows 16-bit words to be spliced into the
  633.           object code.  Its argument is a chain of zero or more expressions
  634.           separated by commas.  If a comma occurs with no preceding
  635.           expression, a word of 0000H is spliced into the code.  The word
  636.           is placed into memory high byte in low address, low byte in high
  637.           address.  The sequence of bytes 0FFH, 0FEH, 00H, 00H, 02H, 01H
  638.           could be spliced into the code with the following statement:
  639.  
  640.                          DW        0FFFEH, , 0201H
  641.  
  642.  
  643.           4.4  Pseudo-ops -- END
  644.  
  645.                The END pseudo-op tells the assembler that the source
  646.           program is over.  Any further lines of the source file are
  647.           ignored and not passed on to the listing.  If an argument is
  648.           added to the END statement, the value of the argument will be
  649.           placed in the execution address slot in the Intel hex object
  650.           file.  The execution address defaults to the program counter
  651.           value at the point where the END was encountered.  Thus, to
  652.           specify that the program starts at label START, the END statement
  653.           would be:
  654.  
  655.                          END       START
  656.  
  657.                If end-of-file is encountered on the source file before an
  658.           END statement is reached, the assembler will add an END statement
  659.           to the listing and flag it with a * (missing statement) error.
  660.  
  661.  
  662.           4.5  Pseudo-ops -- EQU
  663.  
  664.                The EQU pseudo-op is used to assign a specific value to a
  665.           label, thus the label on this line is REQUIRED.  Once the value
  666.           is assigned, it cannot be reassigned by writing the label in
  667.  
  668.  
  669.                                      10
  670.  
  671.  
  672.  
  673.           column 1, by another EQU statement, or by a VAR statement.  Thus,
  674.           for example, the following statement assigns the value 2 to the
  675.           label TWO:
  676.  
  677.                TWO       EQU       1 + 1
  678.  
  679.                The expression in the argument field must contain no forward
  680.           references.
  681.  
  682.  
  683.           4.6  Pseudo-ops -- IF, ELSE, ENDIF
  684.  
  685.                These three pseudo-ops allow the assembler to choose whether
  686.           or not to assemble certain blocks of code based on the result of
  687.           an expression.  Code that is not assembled is passed through to
  688.           the listing but otherwise ignored by the assembler.  The IF
  689.           pseudo-op signals the beginning of a conditionally assembled
  690.           block.  It requires one argument that may contain no forward
  691.           references.  If the value of the argument is non-zero, the block
  692.           is assembled.  Otherwise, the block is ignored.  The ENDIF
  693.           pseudo-op signals the end of the conditionally assembled block.
  694.           For example:
  695.  
  696.                          IF   EXPRESSION     ;This whole thing generates
  697.                          DB   01H, 02H, 03H  ;  no code whatsoever if
  698.                          ENDIF               ;  EXPRESSION is zero.
  699.  
  700.           The ELSE pseudo-op allows the assembly of either one of two
  701.           blocks, but not both.  The following two sequences are
  702.           equivalent:
  703.  
  704.                          IF   EXPRESSION
  705.                          ... some stuff ...
  706.                          ELSE
  707.                          ... some more stuff ...
  708.                          ENDIF
  709.  
  710.                TEMP_LAB  VAR  EXPRESSION
  711.                          IF   TEMP_LAB NE 0
  712.                          ... some stuff ...
  713.                          ENDIF
  714.                          IF   TEMP_LAB EQ 0
  715.                          ... some more stuff ...
  716.                          ENDIF
  717.  
  718.                The pseudo-ops in this group do NOT permit labels to exist
  719.           on the same line as the status of the label (ignored or not)
  720.           would be ambiguous.
  721.  
  722.                All IF statements (even those in ignored conditionally
  723.           assembled blocks) must have corresponding ENDIF statements and
  724.           all ELSE and ENDIF statements must have a corresponding IF
  725.           statement.
  726.  
  727.  
  728.  
  729.  
  730.                                      11
  731.  
  732.  
  733.  
  734.                IF blocks can be nested up to 16 levels deep before the
  735.           assembler dies of a fatal error.  This should be adequate for any
  736.           conceivable job, but if you need more, change the constant
  737.           IFDEPTH in file AS6.H and recompile the assembler.
  738.  
  739.  
  740.           4.7  Pseudo-ops -- INCL
  741.  
  742.                The INCL pseudo-op is used to splice the contents of another
  743.           file into the current file at assembly time.  The name of the
  744.           file to be INCLuded is specified as a normal string constant, so
  745.           the following line would splice the contents of file "const.def"
  746.           into the source code stream:
  747.  
  748.                          INCL      "const.def"
  749.  
  750.                INCLuded files may, in turn, INCLude other files until four
  751.           files are open simultaneously.  This limit should be enough for
  752.           any conceivable job, but if you need more, change the constant
  753.           FILES in file AS6.H and recompile the assembler.
  754.  
  755.  
  756.           4.8  Pseudo-ops -- ORG
  757.  
  758.                The ORG pseudo-op is used to set the assembly program
  759.           counter to a particular value.  The expression that defines this
  760.           value may contain no forward references.  The default initial
  761.           value of the assembly program counter is 0000H.  The following
  762.           statement would change the assembly program counter to 0FFCH:
  763.  
  764.                          ORG       0FFCH
  765.  
  766.                If a label is present on the same line as an ORG statement,
  767.           it is assigned the new value of the assembly program counter.
  768.  
  769.  
  770.           4.9  Pseudo-ops -- PAGE
  771.  
  772.                The PAGE pseudo-op always causes an immediate page ejection
  773.           in the listing by inserting a form feed ('\f') character before
  774.           the next line.  If an argument is specified, the argument
  775.           expression specifies the number of lines per page in the listing.
  776.           Legal values for the expression are any number except 1 and 2.  A
  777.           value of 0 turns the listing pagination off.  Thus, the following
  778.           statement cause a page ejection and would divide the listing into
  779.           60-line pages:
  780.  
  781.                          PAGE      60
  782.  
  783.  
  784.           4.10 Pseudo-ops -- TITLE
  785.  
  786.                The TITL pseudo-op sets the running title for the listing.
  787.           The argument field is required and must be a string constant,
  788.           though the null string ("") is legal.  This title is printed
  789.  
  790.  
  791.                                      12
  792.  
  793.  
  794.  
  795.           after every page ejection in the listing, therefore, if page
  796.           ejections have not been forced by the PAGE pseudo-op, the title
  797.           will never be printed.  The following statement would print the
  798.           title "Random Bug Generator -- Ver 3.14159" at the top of every
  799.           page of the listing:
  800.  
  801.                          TITLE     "Random Bug Generator -- Ver 3.14159"
  802.  
  803.  
  804.           4.11 Pseudo-ops -- VAR
  805.  
  806.                The VAR pseudo-op functions like the EQU pseudo-op except
  807.           that the VAR statement can reassign the value of a label that has
  808.           already been assigned by another VAR statement.  Like the EQU
  809.           statement, the argument expression may contain no forward
  810.           references.  A label defined by a VAR statement cannot be
  811.           redefined by writing it in column 1 or with an EQU statement.
  812.           The following series of statements would set the value of label
  813.           "COUNT" to 1, 2, then 3:
  814.  
  815.                COUNT     VAR       1
  816.                COUNT     VAR       2
  817.                COUNT     VAR       3
  818.  
  819.  
  820.           5.0  Assembly Errors
  821.  
  822.                When a source line contains an illegal construct, the line
  823.           is flagged in the listing with a single-letter code describing
  824.           the error.  The meaning of each code is listed below.  In
  825.           addition, a count of the number of lines with errors is kept and
  826.           printed on the C "stderr" device (by default, the console) after
  827.           the END statement is processed.  If more than one error occurs in
  828.           a given line, only the first is reported.  For example, the
  829.           illegal label "=$#*'(" would generate the following listing line:
  830.  
  831.                L  0000   0D 80 00      =$#*'(     CLR       X
  832.  
  833.  
  834.           5.1  Error * -- Illegal or Missing Statement
  835.  
  836.                This error occurs when either:
  837.  
  838.                1)   the assembler reaches the end of the source file
  839.                     without seeing an END statement, or
  840.  
  841.                2)   an END statement is encountered in an INCLude file.
  842.  
  843.                If you are "sure" that the END statement is present when the
  844.           assembler thinks that it is missing, it probably is in the
  845.           ignored section of an IF block.  If the END statement is missing,
  846.           supply it.  If the END statement is in an INCLude file, delete
  847.           it.
  848.  
  849.  
  850.  
  851.  
  852.                                      13
  853.  
  854.  
  855.  
  856.           5.2  Error ( -- Parenthesis Imbalance
  857.  
  858.                For every left parenthesis, there must be a right paren-
  859.           thesis.  Count them.
  860.  
  861.  
  862.           5.3  Error " -- Missing Quotation Mark
  863.  
  864.                Strings have to begin and end with either " or '.  Remember
  865.           that " only matches " while ' only matches '.
  866.  
  867.  
  868.           5.4  Error B -- Branch Target Too Far Away
  869.  
  870.                The S6 conditional branch instructions and bit conditional
  871.           branch instructions will only reach bytes that are a short
  872.           distance from the first byte of the instruction.  If this error
  873.           occurs, the source code will have to be rearranged to bring the
  874.           branch target into range or a long branch instruction that will
  875.           reach anywhere will have to be used.  Also, see sections 3.7 and
  876.           3.8 above.
  877.  
  878.  
  879.           5.5  Error D -- Illegal Digit
  880.  
  881.                This error occurs if a digit greater than or equal to the
  882.           base of a numeric constant is found.  For example, a 2 in a
  883.           binary number would cause a D error.  Especially, watch for 8 or
  884.           9 in an octal number.
  885.  
  886.  
  887.           5.6  Error E -- Illegal Expression
  888.  
  889.                This error occurs because of:
  890.  
  891.                1)   a missing expression where one is required
  892.  
  893.                2)   a unary operator used as a binary operator or vice-
  894.                     versa
  895.  
  896.                3)   a missing binary operator
  897.  
  898.                4)   a SHL or SHR count that is not 0 thru 15
  899.  
  900.  
  901.           5.7  Error I -- IF-ENDIF Imbalance
  902.  
  903.                For every IF there must be a corresponding ENDIF.  If this
  904.           error occurs on an ELSE or ENDIF statement, the corresponding IF
  905.           is missing.  If this error occurs on an END statement, one or
  906.           more ENDIF statements are missing.
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.                                      14
  914.  
  915.  
  916.  
  917.           5.8  Error L -- Illegal Label
  918.  
  919.                This error occurs because of:
  920.  
  921.                1)   a non-alphabetic in column 1
  922.  
  923.                2)   a reserved word used as a label
  924.  
  925.                3)   a missing label on an EQU or VAR statement
  926.  
  927.                4)   a label on an IF, ELSE, or ENDIF statement
  928.  
  929.  
  930.           5.9  Error M -- Multiply Defined Label
  931.  
  932.                This error occurs because of:
  933.  
  934.                1)   a label defined in column 1 or with the EQU statement
  935.                     being redefined
  936.  
  937.                2)   a label defined by a VAR statement being redefined
  938.                     either in column 1 or with the EQU statement
  939.  
  940.                3)   the value of the label changing between assembly passes
  941.  
  942.  
  943.           5.10 Error O -- Illegal Opcode
  944.  
  945.                The opcode field of a source line may contain only a valid
  946.           machine opcode, a valid pseudo-op, or nothing at all.  Anything
  947.           else causes this error.
  948.  
  949.  
  950.           5.11 Error P -- Phasing Error
  951.  
  952.                This error occurs because of:
  953.  
  954.                1)   a forward reference in a DS, EQU, ORG, or VAR statement
  955.  
  956.                2)   a label disappearing between assembly passes
  957.  
  958.  
  959.           5.12 Error S -- Illegal Syntax
  960.  
  961.                This error means that an argument field is scrambled.  Sort
  962.           the mess out and reassemble.  Look for missing commas, missing
  963.           arguments, and the like.
  964.  
  965.  
  966.           5.13 Error T -- Too Many Arguments
  967.  
  968.                This error occurs if there are more items (expressions,
  969.           register designators, etc.) in the argument field than the opcode
  970.           or pseudo-op requires.  The assembler ignores the extra items but
  971.           issues this error in case something is really mangled.
  972.  
  973.  
  974.                                      15
  975.  
  976.  
  977.  
  978.  
  979.  
  980.           5.14 Error U -- Undefined Label
  981.  
  982.                This error occurs if a label is referenced in an expression
  983.           but not defined anywhere in the source program.  If you are
  984.           "sure" you have defined the label, note that upper and lower case
  985.           letters in labels are different.  Defining "LABEL" does not
  986.           define "Label."
  987.  
  988.  
  989.           5.15 Error V -- Illegal Value
  990.  
  991.                This error occurs because:
  992.  
  993.                1)   an immediate value is not -128 thru 255, or
  994.  
  995.                2)   a DB argument is not -128 thru 255, or
  996.  
  997.                3)   an INCL argument refers to a file that does not exist,
  998.  
  999.                4)   an argument to a CALL or JP instruction is greater than
  1000.                     0FFFH, or
  1001.  
  1002.                5)   a bit number in a JRR, JRS, RES, or SET instruction is
  1003.                     greater than 7, or
  1004.  
  1005.                6)   a data space address is greater than 0FFH.
  1006.  
  1007.  
  1008.           6.0  Warning Messages
  1009.  
  1010.                Some errors that occur during the parsing of the cross-
  1011.           assembler command line are non-fatal.  The cross-assembler flags
  1012.           these with a message on the C "stdout" device (by default, the
  1013.           console) beginning with the word "Warning."  The messages are
  1014.           listed below:
  1015.  
  1016.  
  1017.           6.1  Warning -- Illegal Option Ignored
  1018.  
  1019.                The only options that the cross-assembler knows are -l and
  1020.           -o.  Any other command line argument beginning with - will draw
  1021.           this error.
  1022.  
  1023.  
  1024.           6.2  Warning -- -l Option Ignored -- No File Name
  1025.           6.3  Warning -- -o Option Ignored -- No File Name
  1026.  
  1027.                The -l and -o options require a file name to tell the
  1028.           assembler where to put the listing file or object file.  If this
  1029.           file name is missing, the option is ignored.
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.                                      16
  1036.  
  1037.  
  1038.  
  1039.           6.4  Warning -- Extra Source File Ignored
  1040.  
  1041.                The cross-assembler will only assemble one file at a time,
  1042.           so source file names after the first are ignored.  To assemble a
  1043.           second file, invoke the assembler again.  Note that under CP/M-
  1044.           80, the old trick of reexecuting a core image will NOT work as
  1045.           the initialized data areas are not reinitialized prior to the
  1046.           second run.
  1047.  
  1048.  
  1049.           6.5  Warning -- Extra Listing File Ignored
  1050.           6.6  Warning -- Extra Object File Ignored
  1051.  
  1052.                The cross-assembler will only generate one listing and
  1053.           object file per assembly run, so -l and -o options after the
  1054.           first are ignored.
  1055.  
  1056.  
  1057.           7.0  Fatal Error Messages
  1058.  
  1059.                Several errors that occur during the parsing of the cross-
  1060.           assembler command line or during the assembly run are fatal.  The
  1061.           cross-assembler flags these with a message on the C "stdout"
  1062.           device (by default, the console) beginning with the words "Fatal
  1063.           Error."  The messages are explained below:
  1064.  
  1065.  
  1066.           7.1  Fatal Error -- No Source File Specified
  1067.  
  1068.                This one is self-explanatory.  The assembler does not know
  1069.           what to assemble.
  1070.  
  1071.  
  1072.           7.2  Fatal Error -- Source File Did Not Open
  1073.  
  1074.                The assembler could not open the source file.  The most
  1075.           likely cause is that the source file as specified on the command
  1076.           line does not exist.  On larger systems, there could also be
  1077.           priviledge violations.  Rarely, a read error in the disk
  1078.           directory could cause this error.
  1079.  
  1080.  
  1081.           7.3  Fatal Error -- Listing File Did Not Open
  1082.           7.4  Fatal Error -- Object File Did Not Open
  1083.  
  1084.                This error indicates either a defective listing or object
  1085.           file name or a full disk directory.  Correct the file name or
  1086.           make more room on the disk.
  1087.  
  1088.  
  1089.           7.5  Fatal Error -- Error Reading Source File
  1090.  
  1091.                This error generally indicates a read error in the disk data
  1092.           space.  Use your backup copy of the source file (You do have one,
  1093.           don't you?) to recreate the mangled file and reassemble.
  1094.  
  1095.  
  1096.                                      17
  1097.  
  1098.  
  1099.  
  1100.  
  1101.  
  1102.           7.6  Fatal Error -- Disk or Directory Full
  1103.  
  1104.                This one is self-explanatory.  Some more space must be found
  1105.           either by deleting files or by using a disk with more room on it.
  1106.  
  1107.  
  1108.           7.7  Fatal Error -- File Stack Overflow
  1109.  
  1110.                This error occurs if you exceed the INCLude file limit of
  1111.           four files open simultaneously.  This limit can be increased by
  1112.           increasing the constant FILES in file AS6.H and recompiling the
  1113.           cross-assembler.
  1114.  
  1115.  
  1116.           7.8  Fatal Error -- If Stack Overflow
  1117.  
  1118.                This error occurs if you exceed the nesting limit of 16 IF
  1119.           blocks.  This limit can be increased by increasing the constant
  1120.           IFDEPTH in file AS6.H and recompiling the cross-assembler.
  1121.  
  1122.  
  1123.           7.9  Fatal Error -- Too Many Symbols
  1124.  
  1125.                Congratulations!  You have run out of memory.  The space for
  1126.           the cross-assembler's symbol table is allocated at run-time using
  1127.           the C library function malloc(), so the cross-assembler will use
  1128.           all available memory.  The only solutions to this problem are to
  1129.           lessen the number of labels in the source program or to add more
  1130.           memory.
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.  
  1137.  
  1138.  
  1139.  
  1140.  
  1141.  
  1142.  
  1143.  
  1144.  
  1145.  
  1146.  
  1147.  
  1148.  
  1149.  
  1150.  
  1151.  
  1152.  
  1153.  
  1154.  
  1155.  
  1156.  
  1157.                                      18
  1158.